#include <stdio.h>

#define Size 3

#define ArraySize(a)  sizeof(a) / sizeof(a[0])

// 数组名在作为函数参数传递时表现为指针:地址是数组首元素的地址
void PrintArray(int *a)
{
    for (int i = 0; i < Size; i++)
    {
        printf("%d", a[i]);
    }
}

int main()
{
    // int a[3];
    // printf("%ld\n", sizeof(a)); // 占3*4=12字节//所以数组的内存是连续的
    // 数组单个元素
    // 数组下标：代表数组中的元素序号，从0开始
    // a[0] = 1;
    // a[1] = 2;
    // a[2] = 3;
    // 访问越界：数组访问的下标超过了最大限度

    // 数组通过下标循环访问
    // for (int i = 0; i < 3; i++)
    // {
    //     printf("%d", a[i]);
    // }
    // printf("\n");

    // 数组的初始化
    // int a[]={1,2,3};//这种初始化可以不写数组元素个数 int a[]={1,2,3};

    // 静态数组：容量不能变化的数组(编译器定死的)
    // int a[size]={1,2,3};//用define定义size可以
    // int b=3;//const int b=3;//这个也不行；不变的变量
    // int a[b]={1,2,3};//这种不行

    // 数组的地址是连续的
    //  printf("%p",&a[i]);

    // 数组的容量：数组的总大小 / 单个元素的大小
    //  int a[]={1,2,3,4,5,6,7,8};
    //  sizeof(a)/sizeof(a[0]);
    //  for (int i = 0; i < ArraySize(a); i++)
    //  {
    //      printf("%d %p\n", a[i],&a[i]);
    //  }

    // 封装函数打印
    //  int a[Size] = {1, 2, 3};
    //  PrintArray(a);

    //数组与指针
    // int a[Size] = {1, 2, 3};
    // // 指针的数据类型代表它的步长；访问下一个的时候走几个字节
    // //  int * p=a;
    // //  p++;
    // //  printf("%d\n",*p);  //1
    // for (int i = 0; i < Size; i++)
    // {
    //     printf("%d ", *(a + i));
    //     //a[i]==*(a+i)//通过下标访问与通过指针访问本质一样：取某个内存的值
    // }
    // printf("\n");

    int a[Size] = {1, 2, 3};
    printf("%p %p %p\n",a,&a,&a[0]);     //都是一样的地址
    printf("%p %p %p\n",a+1,&a+1,&a[0]+1);   //
    
    return 0;
}

